package com.nhjf.admin.common.filter;

import com.alibaba.fastjson.JSON;
import com.nhjf.common.util.xss.JsoupXssHtml;
import org.apache.commons.lang.StringEscapeUtils;
import org.apache.commons.lang.StringUtils;
import org.jsoup.Jsoup;
import org.springframework.web.util.HtmlUtils;

import java.beans.PropertyEditorSupport;
import java.net.URLDecoder;

/**
 * @类功能说明：过滤请求参数里面的脚本
 * @类修改者：
 * @修改日期：
 * @修改说明：
 * @公司名称：浙江汇购科技有限公司
 * @部门：技术部
 * @作者：李玄玄
 * @创建时间：2017/12/19 15:44
 * @版本：V1.0
 */
public class StringEditor extends PropertyEditorSupport {


    @Override
    public void setAsText(String text) throws IllegalArgumentException {
        if (StringUtils.isBlank(text)) {
            return;
        }

        try {
            //还原尖括号，然后交给jsoup进行白名单过滤
            text = text.replaceAll("&lt;", "<");
            text = text.replaceAll("&gt;", ">");
            text = text.replaceAll("%(?![0-9a-fA-F]{2})", "%25");
            //强制转码防止通过转码的方式进行注入
            text = URLDecoder.decode(text,"UTF-8");
            if (text.indexOf("<") >= 0) {
                //由于JSOUP处理iframe的问题，这里采用递归的方式处理文本里面所有的iframe标签
                String jsoupText = cleanXss(text);
                super.setValue(jsoupText);
            }else{
                Boolean isjson=false;
                if (text.contains("\"")) {
                    try {
                        JSON.parse(text);
                        isjson=true;
                    } catch (Exception e) {
                        isjson=false;
                    }
                }

                if (!isjson) {
                    //非json格式，对于特殊字符统一进行转译处理
                    text = HtmlUtils.htmlEscapeDecimal(text);
                }
                super.setValue(text);
            }
        } catch (Exception e) {
            e.printStackTrace();
            throw new IllegalArgumentException(e);
        }
    }

    public static String cleanXss(String htmlContent) throws Exception{
        htmlContent = htmlContent.replaceAll("&lt;", "<");
        htmlContent = htmlContent.replaceAll("&gt;", ">");
        htmlContent = htmlContent.replaceAll("%(?![0-9a-fA-F]{2})", "%25");
        htmlContent = URLDecoder.decode(htmlContent,"UTF-8");

        if (htmlContent.indexOf("iframe") == -1){
            htmlContent =Jsoup.clean(htmlContent, JsoupXssHtml.user_content_filter);
            return htmlContent;
        }else{
            htmlContent =Jsoup.clean(htmlContent, JsoupXssHtml.user_content_filter);
            return cleanXss(htmlContent);
        }
    }
//    public static void main(String[] args) throws Exception {
//     String test = "\"/><iframe src=javascript:confirm(456)>%22%2f%3e%3ciframe+src%3djavascript%3aconfirm(456)%3e%3ciframe+src%3djAvasCriPt%3aconfirm%601%60%3e";
//     System.out.println(cleanXss(test));
//    }
}
